﻿#include <iostream>
#include <cstdarg>



//参数列表,实际开发中不要用 ... 这种参数列表
void print(int a, ...) {
	int total = 0;

	// 需要通过 va_list访问省略号, 这里声明一个
	std::va_list list;
	// 通过 va_start 初始化va_list.
	// 第一个参数是va_list. 第二个参数是最后一个非省略号的参数
	va_start(list, a);

	// 遍历所有参数
	for (int i = 0; i < a; i++) {
		// 获取下一个参数，需要指定类型
		int num = va_arg(list, int);
		total += num;
		std::cout << "参数:" << num << "\n";
	}

	// 清理 va_list
	va_end(list);
	std::cout << "total:" << total << "\n";
}





//使用命令行参数: 程序编译后，在控制台执行程序并用空格间隔开后可输入多个参数
//argc是一个整数参数，代表传递给程序的参数数量的个数（argc=参数个数）
//argv是存储实际参数值的位置（argv=参数值）
int main(int argc, char* argv[])
{
	std::cout << "Hello World!\n";

	std::cout << "argc= " << argc << "\n arguments:\n";

	// 遍历每个命令行参数并进行打印
	for (int count{ 0 }; count < argc; ++count)
	{
		std::cout << count << ' ' << argv[count] << '\n';
	}


	//使用参数列表
	print(8, 2, 3, 4, 5, 6, 7, 8, 9);

	/*
	lambda（匿名函数）,
	lambda表达式（也称为闭包）允许我们在函数中定义匿名函数

	lambdas的形式为:
	[捕获列表](参数列表) -> 返回类型
	{
		函数语句;
	}

	如果不需要捕获，则捕获列表可以为空。
	如果不需要参数，则参数列表可以为空。参数列表如果为空，那么可以省略它。
	返回类型是可选的，如果省略，则假定为auto（返回类型会自动推导）。
	虽然我们之前注意到应该避免函数返回类型的自动推导，但在这种情况下，
	使用它是很好用的（因为这些函数通常非常简单）。
	还要注意，lambda函数（匿名）没有名称，因为我们不需要提供名称。
	*/

	// 没有返回类型，没有捕获列表，没有参数的lambda格式：[] {}
	auto ssss{ [] {std::cout << "lambdas" << '\n'; } };
	ssss();

	// Good: 将lambda函数存储在一个命名变量中，增加可读性
	auto isEven{
	  [](int i)
	  {
		return (i % 2) == 0;
	  }
	};
	for (int i = 0; i < 5; i++)
	{
		if (isEven(i))std::cout << i << ' ' << '\n';
	}





}
